# LeetCode 226、翻转二叉树

# 一、题目描述

你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

示例 1:

img

img

输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]

示例 2:

img

img

输入:root = [2,1,3]
输出:[2,3,1]

示例 3:

输入:root = []
输出:[]

提示:

  • 树中节点数目范围在 [0, 100]
  • -100 <= Node.val <= 100

# 二、题目解析

# 三、参考代码

# 1、Java 代码

// 登录 AlgoMooc 官网获取更多算法图解
// https://www.algomooc.com
// 作者:程序员吴师兄
// 微信:wzb_3377
// 代码有看不懂的地方一定要私聊咨询吴师兄呀
// 翻转二叉树(LeetCode 226):https://leetcode.cn/problems/invert-binary-tree/
class Solution {
    public TreeNode invertTree(TreeNode root) {

        // 1、递归终止条件一,当前节点为空的时候,就返回 null
        if(root == null) return null;

        // 2、递归终止条件二,当前节点为叶子节点的时候,就返回这个节点
        if( root.left == null && root.right == null){
            
            // 返回这个节点
            return root;

        }

        // 3、把当前这个节点 root 的左子树进行翻转操作
        TreeNode left =  invertTree(root.left);

        // 4、把当前这个节点 root 的右子树进行翻转操作
        TreeNode right = invertTree(root.right);

        // 5、把翻转成功的右子树赋值给 root 的左子树
        root.left = right;

        // 6、把翻转成功的左子树赋值给 root 的右子树
        root.right = left;

        // 7、返回翻转成功的二叉树的根节点
        return root;

    }
}

# 2、C++ 代码

class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {

        // 1、递归终止条件一,当前节点为空的时候,就返回 nullptr
        if(root == nullptr) return nullptr;

        // 2、递归终止条件二,当前节点为叶子节点的时候,就返回这个节点
        if( root->left == nullptr && root->right == nullptr){
            
            // 返回这个节点
            return root;

        }

        // 3、把当前这个节点 root 的左子树进行翻转操作
        TreeNode *left =  invertTree(root->left);

        // 4、把当前这个节点 root 的右子树进行翻转操作
        TreeNode *right = invertTree(root->right);

        // 5、把翻转成功的右子树赋值给 root 的左子树
        root->left = right;

        // 6、把翻转成功的左子树赋值给 root 的右子树
        root->right = left;

        // 7、返回翻转成功的二叉树的根节点
        return root;

    }
};

# 3、Python 代码

class Solution:
    def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:

        # 1、递归终止条件一,当前节点为空的时候,就返回 null
        if not root : return None

        # 2、递归终止条件二,当前节点为叶子节点的时候,就返回这个节点
        if  root.left == None and root.right == None :
            # 返回这个节点
            return root

        # 3、把当前这个节点 root 的左子树进行翻转操作
        left =  self.invertTree(root.left)

        # 4、把当前这个节点 root 的右子树进行翻转操作
        right = self.invertTree(root.right)

        # 5、把翻转成功的右子树赋值给 root 的左子树
        root.left = right

        # 6、把翻转成功的左子树赋值给 root 的右子树
        root.right = left

        # 7、返回翻转成功的二叉树的根节点
        return root